From 74ac9a0ad81eb87240f3c4c36108d1257a38db44 Mon Sep 17 00:00:00 2001 From: robertl Date: Thu, 13 Jul 2006 21:25:24 +0000 Subject: [PATCH] Pick up missing files from recent gbser commit. --- gbser.c | 181 ++++++++++++++++++++++++++++++++++++++++++++++++ gbser_private.h | 27 ++++++++ 2 files changed, 208 insertions(+) create mode 100644 gbser.c create mode 100644 gbser_private.h diff --git a/gbser.c b/gbser.c new file mode 100644 index 000000000..0daff0d79 --- /dev/null +++ b/gbser.c @@ -0,0 +1,181 @@ +/* + Serial interface + + Copyright (C) 2006 Robert Lipe, robertlipe@usa.net + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111 USA + + */ + +#include "defs.h" +#include "gbser.h" +#include "gbser_private.h" + +#include +#include + +void gbser__db(int l, const char *msg, ...) { + va_list ap; + va_start(ap, msg); + if (global_opts.debug_level >= l) { + vprintf(msg, ap); + } + va_end(ap); +} + +/* Set the serial port speed. + */ +int gbser_set_speed(void *handle, unsigned speed) { + return gbser_set_port(handle, speed, 8, 0, 1); +} + +static int parity_letter(char c) { + switch (c) { + case 'N': case 'n': + return 0; + case 'O': case 'o': + return 1; + case 'E': case 'e': + return 2; + default: + return -1; + } +} + +/* Set the serial port up by parsing the supplied parameter string. + * Valid parameter strings look like '4800,8,N,1'. Parsing is case- + * insensitive, spaces are allowed around the commas and omitted + * trailing fields will default to '8', 'N' and '1' + */ +int gbser_setup(void *handle, const char *spec) { + unsigned arg[] = { 4800, 8, 0, 1 }; + int ap; + + for (ap = 0; ap < sizeof(arg) / sizeof(arg[0]); ap++) { + unsigned t = 0; + int pl; + while (isspace(*spec)) { spec++; } + /* Allow 'N', 'O' or 'E' as the parity spec */ + if (ap == 2 && (pl = parity_letter(*spec), pl >= 0)) { + t = pl; + spec++; + } else { + if (!isdigit(*spec)) { break; } + while (isdigit(*spec)) { t = t * 10 + *spec++ - '0'; } + } + arg[ap] = t; + while (isspace(*spec)) { spec++; } + if (*spec != ',') { break; } + spec++; + } + + if (*spec != '\0') { + return gbser_ERROR; + } + + return gbser_set_port(handle, arg[0], arg[1], arg[2], arg[3]); +} + +/* Return true if there are characters available on the serial port + */ +int gbser_avail(void *handle) { + return gbser__fill_buffer(handle, 1, NULL); +} + +/* Read as many bytes as are available without blocking. At most |len| + * bytes will be read. Returns the number of bytes read or gbser_ERROR if an + * error occurs. + */ +int gbser_read(void *handle, void *buf, unsigned len) { + int got = 0; + + while (len > 0) { + int rc = gbser__fill_buffer(handle, len, NULL); + if (rc < 0) { + /* error */ + return rc; + } else if (rc == 0) { + /* nothing available */ + break; + } + got += gbser__read_buffer(handle, &buf, &len); + } + + return got; +} + +/* Read the specified number of bytes. Block until the requested number + * of bytes have been read or the timeout (in ms) is exceeded. + */ +int gbser_read_wait(void *handle, void *buf, unsigned len, unsigned ms) { + int got = 0; + + while (len > 0 && ms != 0) { + int rc; + if (rc = gbser__fill_buffer(handle, len, &ms), rc < 0) { + return rc; + } + got += gbser__read_buffer(handle, &buf, &len); + } + + return got; +} + +/* Read a single character from the port, returning immediately if + * none are available. + */ +int gbser_readc(void *handle) { + char buf; + int rc; + + rc = gbser_read(handle, &buf, 1); + if (rc > 0) { + return buf; + } else if (rc == 0) { + return gbser_NOTHING; + } else { + return gbser_ERROR; + } +} + +/* Read a single character from the port, waiting up to |ms| + * milliseconds for a character to be available. + */ +int gbser_readc_wait(void *handle, unsigned ms) { + char buf; + int rc; + + rc = gbser_read_wait(handle, &buf, 1, ms); + if (rc > 0) { + return buf; + } else if (rc == 0) { + return gbser_NOTHING; + } else { + return gbser_ERROR; + } +} + +/* Write a null terminated string in |str| to the serial + * port. + */ +int gbser_print(void *handle, const char *str) { + return gbser_write(handle, str, (unsigned) strlen(str)); +} + +/* Write a single character to the serial port. + */ +int gbser_writec(void *handle, int c) { + return gbser_write(handle, &c, 1); +} diff --git a/gbser_private.h b/gbser_private.h new file mode 100644 index 000000000..318455e80 --- /dev/null +++ b/gbser_private.h @@ -0,0 +1,27 @@ +/* + Serial interface - private header for gbser*.c + + Copyright (C) 2006 Robert Lipe, robertlipe@usa.net + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111 USA + + */ + +#define MYMAGIC 0x91827364 +#define BUFSIZE 512 + +void gbser__db(int l, const char *msg, ...); +int gbser__fill_buffer(void *h, unsigned want, unsigned *ms); +unsigned gbser__read_buffer(void *handle, void **buf, unsigned *len); -- 2.30.2